postgresql.conf.sample tab width
I noticed that GitHub is using 4-space tabs for this file [0]https://github.com/postgres/postgres/blob/master/src/backend/utils/misc/postgresql.conf.sample, presumably
due to this [1]https://github.blog/changelog/2025-08-07-default-tab-size-changed-from-eight-to-four/ recent change. I'm not aware of an official policy for
this file, but it seems to be written for 8-space tabs.
One way to fix this is to set our default tab width to 8 in
.gitattributes/.editorconfig (see attached patch). AFAICT that doesn't
affect source code files. We could also add a special rule for
postgresql.conf.sample, or we could even convert it to 4-space tabs. Any
druthers?
[0]: https://github.com/postgres/postgres/blob/master/src/backend/utils/misc/postgresql.conf.sample
[1]: https://github.blog/changelog/2025-08-07-default-tab-size-changed-from-eight-to-four/
--
nathan
Attachments:
v1-0001-Change-default-tab-width-to-8.patchtext/plain; charset=us-asciiDownload
From c34c6232589e7d951d447b201fbd97cc8003c826 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Fri, 14 Nov 2025 14:03:55 -0600
Subject: [PATCH v1 1/1] Change default tab width to 8.
---
.editorconfig | 2 +-
.gitattributes | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.editorconfig b/.editorconfig
index e20d15d4533..5f6493c31b7 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -7,7 +7,7 @@ indent_size = tab
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = unset
-tab_width = unset
+tab_width = 8
[*.[chly]]
trim_trailing_whitespace = true
diff --git a/.gitattributes b/.gitattributes
index 4e26bbfb145..58fd4444b58 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,6 @@
# IMPORTANT: After updating this file, also run src/tools/generate_editorconfig.py
-* whitespace=space-before-tab,trailing-space
+* whitespace=space-before-tab,trailing-space,tabwidth=8
*.[chly] whitespace=space-before-tab,trailing-space,indent-with-non-tab,tabwidth=4
*.cpp whitespace=space-before-tab,trailing-space,indent-with-non-tab,tabwidth=4
*.pl whitespace=space-before-tab,trailing-space,tabwidth=4
--
2.39.5 (Apple Git-154)
Nathan Bossart <nathandbossart@gmail.com> writes:
I noticed that GitHub is using 4-space tabs for this file [0], presumably
due to this [1] recent change. I'm not aware of an official policy for
this file, but it seems to be written for 8-space tabs.
One way to fix this is to set our default tab width to 8 in
.gitattributes/.editorconfig (see attached patch). AFAICT that doesn't
affect source code files. We could also add a special rule for
postgresql.conf.sample, or we could even convert it to 4-space tabs. Any
druthers?
We've been around on this topic before. It's hard for us to deal with
8-space tabs within our repo, but we should expect that users who are
editing their postgresql.conf files are probably going to be using
8-space tabs.
I seem to recall a proposal that the best fix is to not use tabs
at all in postgresql.conf.sample. That seems like a good way out
to me. I think we could fix .gitattributes so that "git diff --check"
would verify no tabs, but I've not looked into details.
regards, tom lane
On Fri, Nov 14, 2025 at 03:25:15PM -0500, Tom Lane wrote:
I seem to recall a proposal that the best fix is to not use tabs
at all in postgresql.conf.sample. That seems like a good way out
to me. I think we could fix .gitattributes so that "git diff --check"
would verify no tabs, but I've not looked into details.
I don't see a way in .gitattributes to check for _any_ tabs in a file, just
for beginning-of-line indentation with tabs. But it's easy enough to add a
check in the TAP test.
--
nathan
Attachments:
v2-0001-Convert-tabs-to-spaces-in-postgresql.conf.sample.patchtext/plain; charset=us-asciiDownload
From 5bd404a1f98267fe9326f42846ff1afba90ae76d Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Fri, 14 Nov 2025 14:56:14 -0600
Subject: [PATCH v2 1/1] Convert tabs to spaces in postgresql.conf.sample.
---
.editorconfig | 6 +
.gitattributes | 1 +
src/backend/utils/misc/postgresql.conf.sample | 974 +++++++++---------
src/test/modules/test_misc/t/003_check_guc.pl | 16 +
4 files changed, 510 insertions(+), 487 deletions(-)
diff --git a/.editorconfig b/.editorconfig
index e20d15d4533..0ee9bd28ac4 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -85,6 +85,12 @@ insert_final_newline = true
indent_style = unset
tab_width = unset
+[src/backend/utils/misc/postgresql.conf.sample]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+tab_width = unset
+
[*.out]
indent_style = unset
indent_size = unset
diff --git a/.gitattributes b/.gitattributes
index 4e26bbfb145..9722b42cf70 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -19,6 +19,7 @@ README.* conflict-marker-size=48
*.data -whitespace
contrib/pgcrypto/sql/pgp-armor.sql whitespace=-blank-at-eol
src/backend/catalog/sql_features.txt whitespace=space-before-tab,blank-at-eof,-blank-at-eol
+src/backend/utils/misc/postgresql.conf.sample whitespace=trailing-space,tab-in-indent
# Test output files that contain extra whitespace
*.out -whitespace
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 6268c175298..69026502074 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -39,16 +39,16 @@
# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.
-#data_directory = 'ConfigDir' # use data in another directory
- # (change requires restart)
-#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
- # (change requires restart)
-#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
- # (change requires restart)
+#data_directory = 'ConfigDir' # use data in another directory
+ # (change requires restart)
+#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
+ # (change requires restart)
+#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
+ # (change requires restart)
# If external_pid_file is not explicitly set, no extra PID file is written.
-#external_pid_file = '' # write an extra PID file
- # (change requires restart)
+#external_pid_file = '' # write an extra PID file
+ # (change requires restart)
#------------------------------------------------------------------------------
@@ -57,47 +57,47 @@
# - Connection Settings -
-#listen_addresses = 'localhost' # what IP address(es) to listen on;
- # comma-separated list of addresses;
- # defaults to 'localhost'; use '*' for all
- # (change requires restart)
-#port = 5432 # (change requires restart)
-#max_connections = 100 # (change requires restart)
-#reserved_connections = 0 # (change requires restart)
-#superuser_reserved_connections = 3 # (change requires restart)
-#unix_socket_directories = '/tmp' # comma-separated list of directories
- # (change requires restart)
-#unix_socket_group = '' # (change requires restart)
-#unix_socket_permissions = 0777 # begin with 0 to use octal notation
- # (change requires restart)
-#bonjour = off # advertise server via Bonjour
- # (change requires restart)
-#bonjour_name = '' # defaults to the computer name
- # (change requires restart)
+#listen_addresses = 'localhost' # what IP address(es) to listen on;
+ # comma-separated list of addresses;
+ # defaults to 'localhost'; use '*' for all
+ # (change requires restart)
+#port = 5432 # (change requires restart)
+#max_connections = 100 # (change requires restart)
+#reserved_connections = 0 # (change requires restart)
+#superuser_reserved_connections = 3 # (change requires restart)
+#unix_socket_directories = '/tmp' # comma-separated list of directories
+ # (change requires restart)
+#unix_socket_group = '' # (change requires restart)
+#unix_socket_permissions = 0777 # begin with 0 to use octal notation
+ # (change requires restart)
+#bonjour = off # advertise server via Bonjour
+ # (change requires restart)
+#bonjour_name = '' # defaults to the computer name
+ # (change requires restart)
# - TCP settings -
# see "man tcp" for details
-#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds;
- # 0 selects the system default
-#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds;
- # 0 selects the system default
-#tcp_keepalives_count = 0 # TCP_KEEPCNT;
- # 0 selects the system default
-#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds;
- # 0 selects the system default
+#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds;
+ # 0 selects the system default
+#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds;
+ # 0 selects the system default
+#tcp_keepalives_count = 0 # TCP_KEEPCNT;
+ # 0 selects the system default
+#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds;
+ # 0 selects the system default
-#client_connection_check_interval = 0 # time between checks for client
- # disconnection while running queries;
- # 0 for never
+#client_connection_check_interval = 0 # time between checks for client
+ # disconnection while running queries;
+ # 0 for never
# - Authentication -
-#authentication_timeout = 1min # 1s-600s
-#password_encryption = scram-sha-256 # scram-sha-256 or md5
+#authentication_timeout = 1min # 1s-600s
+#password_encryption = scram-sha-256 # scram-sha-256 or md5
#scram_iterations = 4096
#md5_password_warnings = on
-#oauth_validator_libraries = '' # comma-separated list of trusted validator modules
+#oauth_validator_libraries = '' # comma-separated list of trusted validator modules
# GSSAPI using Kerberos
#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab'
@@ -112,8 +112,8 @@
#ssl_crl_file = ''
#ssl_crl_dir = ''
#ssl_key_file = 'server.key'
-#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed TLSv1.2 ciphers
-#ssl_tls13_ciphers = '' # allowed TLSv1.3 cipher suites, blank for default
+#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed TLSv1.2 ciphers
+#ssl_tls13_ciphers = '' # allowed TLSv1.3 cipher suites, blank for default
#ssl_prefer_server_ciphers = on
#ssl_groups = 'X25519:prime256v1'
#ssl_min_protocol_version = 'TLSv1.2'
@@ -129,96 +129,96 @@
# - Memory -
-#shared_buffers = 128MB # min 128kB
- # (change requires restart)
-#huge_pages = try # on, off, or try
- # (change requires restart)
-#huge_page_size = 0 # zero for system default
- # (change requires restart)
-#temp_buffers = 8MB # min 800kB
-#max_prepared_transactions = 0 # zero disables the feature
- # (change requires restart)
+#shared_buffers = 128MB # min 128kB
+ # (change requires restart)
+#huge_pages = try # on, off, or try
+ # (change requires restart)
+#huge_page_size = 0 # zero for system default
+ # (change requires restart)
+#temp_buffers = 8MB # min 800kB
+#max_prepared_transactions = 0 # zero disables the feature
+ # (change requires restart)
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
-#work_mem = 4MB # min 64kB
-#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem
-#maintenance_work_mem = 64MB # min 64kB
-#autovacuum_work_mem = -1 # min 64kB, or -1 to use maintenance_work_mem
-#logical_decoding_work_mem = 64MB # min 64kB
-#max_stack_depth = 2MB # min 100kB
-#shared_memory_type = mmap # the default is the first option
- # supported by the operating system:
- # mmap
- # sysv
- # windows
- # (change requires restart)
-#dynamic_shared_memory_type = posix # the default is usually the first option
- # supported by the operating system:
- # posix
- # sysv
- # windows
- # mmap
- # (change requires restart)
-#min_dynamic_shared_memory = 0MB # (change requires restart)
-#vacuum_buffer_usage_limit = 2MB # size of vacuum and analyze buffer access strategy ring;
- # 0 to disable vacuum buffer access strategy;
- # range 128kB to 16GB
+#work_mem = 4MB # min 64kB
+#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem
+#maintenance_work_mem = 64MB # min 64kB
+#autovacuum_work_mem = -1 # min 64kB, or -1 to use maintenance_work_mem
+#logical_decoding_work_mem = 64MB # min 64kB
+#max_stack_depth = 2MB # min 100kB
+#shared_memory_type = mmap # the default is the first option
+ # supported by the operating system:
+ # mmap
+ # sysv
+ # windows
+ # (change requires restart)
+#dynamic_shared_memory_type = posix # the default is usually the first option
+ # supported by the operating system:
+ # posix
+ # sysv
+ # windows
+ # mmap
+ # (change requires restart)
+#min_dynamic_shared_memory = 0MB # (change requires restart)
+#vacuum_buffer_usage_limit = 2MB # size of vacuum and analyze buffer access strategy ring;
+ # 0 to disable vacuum buffer access strategy;
+ # range 128kB to 16GB
# SLRU buffers (change requires restart)
-#commit_timestamp_buffers = 0 # memory for pg_commit_ts (0 = auto)
-#multixact_offset_buffers = 16 # memory for pg_multixact/offsets
-#multixact_member_buffers = 32 # memory for pg_multixact/members
-#notify_buffers = 16 # memory for pg_notify
-#serializable_buffers = 32 # memory for pg_serial
-#subtransaction_buffers = 0 # memory for pg_subtrans (0 = auto)
-#transaction_buffers = 0 # memory for pg_xact (0 = auto)
+#commit_timestamp_buffers = 0 # memory for pg_commit_ts (0 = auto)
+#multixact_offset_buffers = 16 # memory for pg_multixact/offsets
+#multixact_member_buffers = 32 # memory for pg_multixact/members
+#notify_buffers = 16 # memory for pg_notify
+#serializable_buffers = 32 # memory for pg_serial
+#subtransaction_buffers = 0 # memory for pg_subtrans (0 = auto)
+#transaction_buffers = 0 # memory for pg_xact (0 = auto)
# - Disk -
-#temp_file_limit = -1 # limits per-process temp file space
- # in kilobytes, or -1 for no limit
+#temp_file_limit = -1 # limits per-process temp file space
+ # in kilobytes, or -1 for no limit
-#file_copy_method = copy # copy, clone (if supported by OS)
+#file_copy_method = copy # copy, clone (if supported by OS)
-#max_notify_queue_pages = 1048576 # limits the number of SLRU pages allocated
- # for NOTIFY / LISTEN queue
+#max_notify_queue_pages = 1048576 # limits the number of SLRU pages allocated
+ # for NOTIFY / LISTEN queue
# - Kernel Resources -
-#max_files_per_process = 1000 # min 64
- # (change requires restart)
+#max_files_per_process = 1000 # min 64
+ # (change requires restart)
# - Background Writer -
-#bgwriter_delay = 200ms # 10-10000ms between rounds
-#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables
-#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round
-#bgwriter_flush_after = 0 # measured in pages, 0 disables
+#bgwriter_delay = 200ms # 10-10000ms between rounds
+#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables
+#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round
+#bgwriter_flush_after = 0 # measured in pages, 0 disables
# - I/O -
-#backend_flush_after = 0 # measured in pages, 0 disables
-#effective_io_concurrency = 16 # 1-1000; 0 disables issuing multiple simultaneous IO requests
-#maintenance_io_concurrency = 16 # 1-1000; same as effective_io_concurrency
-#io_max_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
- # (change requires restart)
-#io_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
-
-#io_method = worker # worker, io_uring, sync
- # (change requires restart)
-#io_max_concurrency = -1 # Max number of IOs that one process
- # can execute simultaneously
- # -1 sets based on shared_buffers
- # (change requires restart)
-#io_workers = 3 # 1-32;
+#backend_flush_after = 0 # measured in pages, 0 disables
+#effective_io_concurrency = 16 # 1-1000; 0 disables issuing multiple simultaneous IO requests
+#maintenance_io_concurrency = 16 # 1-1000; same as effective_io_concurrency
+#io_max_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
+ # (change requires restart)
+#io_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
+
+#io_method = worker # worker, io_uring, sync
+ # (change requires restart)
+#io_max_concurrency = -1 # Max number of IOs that one process
+ # can execute simultaneously
+ # -1 sets based on shared_buffers
+ # (change requires restart)
+#io_workers = 3 # 1-32;
# - Worker Processes -
-#max_worker_processes = 8 # (change requires restart)
-#max_parallel_workers_per_gather = 2 # limited by max_parallel_workers
-#max_parallel_maintenance_workers = 2 # limited by max_parallel_workers
-#max_parallel_workers = 8 # number of max_worker_processes that
- # can be used in parallel operations
+#max_worker_processes = 8 # (change requires restart)
+#max_parallel_workers_per_gather = 2 # limited by max_parallel_workers
+#max_parallel_maintenance_workers = 2 # limited by max_parallel_workers
+#max_parallel_workers = 8 # number of max_worker_processes that
+ # can be used in parallel operations
#parallel_leader_participation = on
@@ -228,104 +228,104 @@
# - Settings -
-#wal_level = replica # minimal, replica, or logical
- # (change requires restart)
-#fsync = on # flush data to disk for crash safety
- # (turning this off can cause
- # unrecoverable data corruption)
-#synchronous_commit = on # synchronization level;
- # off, local, remote_write, remote_apply, or on
-#wal_sync_method = fsync # the default is the first option
- # supported by the operating system:
- # open_datasync
- # fdatasync (default on Linux and FreeBSD)
- # fsync
- # fsync_writethrough
- # open_sync
-#full_page_writes = on # recover from partial page writes
-#wal_log_hints = off # also do full page writes of non-critical updates
- # (change requires restart)
-#wal_compression = off # enables compression of full-page writes;
- # off, pglz, lz4, zstd, or on
-#wal_init_zero = on # zero-fill new WAL files
-#wal_recycle = on # recycle WAL files
-#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
- # (change requires restart)
-#wal_writer_delay = 200ms # 1-10000 milliseconds
-#wal_writer_flush_after = 1MB # measured in pages, 0 disables
+#wal_level = replica # minimal, replica, or logical
+ # (change requires restart)
+#fsync = on # flush data to disk for crash safety
+ # (turning this off can cause
+ # unrecoverable data corruption)
+#synchronous_commit = on # synchronization level;
+ # off, local, remote_write, remote_apply, or on
+#wal_sync_method = fsync # the default is the first option
+ # supported by the operating system:
+ # open_datasync
+ # fdatasync (default on Linux and FreeBSD)
+ # fsync
+ # fsync_writethrough
+ # open_sync
+#full_page_writes = on # recover from partial page writes
+#wal_log_hints = off # also do full page writes of non-critical updates
+ # (change requires restart)
+#wal_compression = off # enables compression of full-page writes;
+ # off, pglz, lz4, zstd, or on
+#wal_init_zero = on # zero-fill new WAL files
+#wal_recycle = on # recycle WAL files
+#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
+ # (change requires restart)
+#wal_writer_delay = 200ms # 1-10000 milliseconds
+#wal_writer_flush_after = 1MB # measured in pages, 0 disables
#wal_skip_threshold = 2MB
-#commit_delay = 0 # range 0-100000, in microseconds
-#commit_siblings = 5 # range 0-1000
+#commit_delay = 0 # range 0-100000, in microseconds
+#commit_siblings = 5 # range 0-1000
# - Checkpoints -
-#checkpoint_timeout = 5min # range 30s-1d
-#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
-#checkpoint_flush_after = 0 # measured in pages, 0 disables
-#checkpoint_warning = 30s # 0 disables
+#checkpoint_timeout = 5min # range 30s-1d
+#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
+#checkpoint_flush_after = 0 # measured in pages, 0 disables
+#checkpoint_warning = 30s # 0 disables
#max_wal_size = 1GB
#min_wal_size = 80MB
# - Prefetching during recovery -
-#recovery_prefetch = try # prefetch pages referenced in the WAL?
-#wal_decode_buffer_size = 512kB # lookahead window used for prefetching
- # (change requires restart)
+#recovery_prefetch = try # prefetch pages referenced in the WAL?
+#wal_decode_buffer_size = 512kB # lookahead window used for prefetching
+ # (change requires restart)
# - Archiving -
-#archive_mode = off # enables archiving; off, on, or always
- # (change requires restart)
-#archive_library = '' # library to use to archive a WAL file
- # (empty string indicates archive_command should
- # be used)
-#archive_command = '' # command to use to archive a WAL file
- # placeholders: %p = path of file to archive
- # %f = file name only
- # e.g. 'test ! -f "/mnt/server/archivedir/%f" && cp "%p" "/mnt/server/archivedir/%f"'
-#archive_timeout = 0 # force a WAL file switch after this
- # number of seconds; 0 disables
+#archive_mode = off # enables archiving; off, on, or always
+ # (change requires restart)
+#archive_library = '' # library to use to archive a WAL file
+ # (empty string indicates archive_command should
+ # be used)
+#archive_command = '' # command to use to archive a WAL file
+ # placeholders: %p = path of file to archive
+ # %f = file name only
+ # e.g. 'test ! -f "/mnt/server/archivedir/%f" && cp "%p" "/mnt/server/archivedir/%f"'
+#archive_timeout = 0 # force a WAL file switch after this
+ # number of seconds; 0 disables
# - Archive Recovery -
# These are only used in recovery mode.
-#restore_command = '' # command to use to restore an archived WAL file
- # placeholders: %p = path of file to restore
- # %f = file name only
- # e.g. 'cp "/mnt/server/archivedir/%f" "%p"'
-#archive_cleanup_command = '' # command to execute at every restartpoint
-#recovery_end_command = '' # command to execute at completion of recovery
+#restore_command = '' # command to use to restore an archived WAL file
+ # placeholders: %p = path of file to restore
+ # %f = file name only
+ # e.g. 'cp "/mnt/server/archivedir/%f" "%p"'
+#archive_cleanup_command = '' # command to execute at every restartpoint
+#recovery_end_command = '' # command to execute at completion of recovery
# - Recovery Target -
# Set these only when performing a targeted recovery.
-#recovery_target = '' # 'immediate' to end recovery as soon as a
- # consistent state is reached
- # (change requires restart)
-#recovery_target_name = '' # the named restore point to which recovery will proceed
- # (change requires restart)
-#recovery_target_time = '' # the time stamp up to which recovery will proceed
- # (change requires restart)
-#recovery_target_xid = '' # the transaction ID up to which recovery will proceed
- # (change requires restart)
-#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed
- # (change requires restart)
-#recovery_target_inclusive = on # Specifies whether to stop:
- # just after the specified recovery target (on)
- # just before the recovery target (off)
- # (change requires restart)
-#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID
- # (change requires restart)
-#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown'
- # (change requires restart)
+#recovery_target = '' # 'immediate' to end recovery as soon as a
+ # consistent state is reached
+ # (change requires restart)
+#recovery_target_name = '' # the named restore point to which recovery will proceed
+ # (change requires restart)
+#recovery_target_time = '' # the time stamp up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_xid = '' # the transaction ID up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_inclusive = on # Specifies whether to stop:
+ # just after the specified recovery target (on)
+ # just before the recovery target (off)
+ # (change requires restart)
+#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID
+ # (change requires restart)
+#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown'
+ # (change requires restart)
# - WAL Summarization -
-#summarize_wal = off # run WAL summarizer process?
-#wal_summary_keep_time = '10d' # when to remove old summary files, 0 = never
+#summarize_wal = off # run WAL summarizer process?
+#wal_summary_keep_time = '10d' # when to remove old summary files, 0 = never
#------------------------------------------------------------------------------
@@ -336,66 +336,66 @@
# Set these on the primary and on any standby that will send replication data.
-#max_wal_senders = 10 # max number of walsender processes
- # (change requires restart)
-#max_replication_slots = 10 # max number of replication slots
- # (change requires restart)
-#wal_keep_size = 0 # in megabytes; 0 disables
-#max_slot_wal_keep_size = -1 # in megabytes; -1 disables
-#idle_replication_slot_timeout = 0 # in seconds; 0 disables
-#wal_sender_timeout = 60s # in milliseconds; 0 disables
-#track_commit_timestamp = off # collect timestamp of transaction commit
- # (change requires restart)
+#max_wal_senders = 10 # max number of walsender processes
+ # (change requires restart)
+#max_replication_slots = 10 # max number of replication slots
+ # (change requires restart)
+#wal_keep_size = 0 # in megabytes; 0 disables
+#max_slot_wal_keep_size = -1 # in megabytes; -1 disables
+#idle_replication_slot_timeout = 0 # in seconds; 0 disables
+#wal_sender_timeout = 60s # in milliseconds; 0 disables
+#track_commit_timestamp = off # collect timestamp of transaction commit
+ # (change requires restart)
# - Primary Server -
# These settings are ignored on a standby server.
-#synchronous_standby_names = '' # standby servers that provide sync rep
- # method to choose sync standbys, number of sync standbys,
- # and comma-separated list of application_name
- # from standby(s); '*' = all
-#synchronized_standby_slots = '' # streaming replication standby server slot
- # names that logical walsender processes will wait for
+#synchronous_standby_names = '' # standby servers that provide sync rep
+ # method to choose sync standbys, number of sync standbys,
+ # and comma-separated list of application_name
+ # from standby(s); '*' = all
+#synchronized_standby_slots = '' # streaming replication standby server slot
+ # names that logical walsender processes will wait for
# - Standby Servers -
# These settings are ignored on a primary server.
-#primary_conninfo = '' # connection string to sending server
-#primary_slot_name = '' # replication slot on sending server
-#hot_standby = on # "off" disallows queries during recovery
- # (change requires restart)
-#max_standby_archive_delay = 30s # max delay before canceling queries
- # when reading WAL from archive;
- # -1 allows indefinite delay
-#max_standby_streaming_delay = 30s # max delay before canceling queries
- # when reading streaming WAL;
- # -1 allows indefinite delay
-#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name
- # is not set
-#wal_receiver_status_interval = 10s # send replies at least this often
- # 0 disables
-#hot_standby_feedback = off # send info from standby to prevent
- # query conflicts
-#wal_receiver_timeout = 60s # time that receiver waits for
- # communication from primary
- # in milliseconds; 0 disables
-#wal_retrieve_retry_interval = 5s # time to wait before retrying to
- # retrieve WAL after a failed attempt
-#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery
-#sync_replication_slots = off # enables slot synchronization on the physical standby from the primary
+#primary_conninfo = '' # connection string to sending server
+#primary_slot_name = '' # replication slot on sending server
+#hot_standby = on # "off" disallows queries during recovery
+ # (change requires restart)
+#max_standby_archive_delay = 30s # max delay before canceling queries
+ # when reading WAL from archive;
+ # -1 allows indefinite delay
+#max_standby_streaming_delay = 30s # max delay before canceling queries
+ # when reading streaming WAL;
+ # -1 allows indefinite delay
+#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name
+ # is not set
+#wal_receiver_status_interval = 10s # send replies at least this often
+ # 0 disables
+#hot_standby_feedback = off # send info from standby to prevent
+ # query conflicts
+#wal_receiver_timeout = 60s # time that receiver waits for
+ # communication from primary
+ # in milliseconds; 0 disables
+#wal_retrieve_retry_interval = 5s # time to wait before retrying to
+ # retrieve WAL after a failed attempt
+#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery
+#sync_replication_slots = off # enables slot synchronization on the physical standby from the primary
# - Subscribers -
# These settings are ignored on a publisher.
-#max_active_replication_origins = 10 # max number of active replication origins
- # (change requires restart)
-#max_logical_replication_workers = 4 # taken from max_worker_processes
- # (change requires restart)
-#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers
-#max_parallel_apply_workers_per_subscription = 2 # taken from max_logical_replication_workers
+#max_active_replication_origins = 10 # max number of active replication origins
+ # (change requires restart)
+#max_logical_replication_workers = 4 # taken from max_worker_processes
+ # (change requires restart)
+#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers
+#max_parallel_apply_workers_per_subscription = 2 # taken from max_logical_replication_workers
#------------------------------------------------------------------------------
@@ -432,49 +432,49 @@
# - Planner Cost Constants -
-#seq_page_cost = 1.0 # measured on an arbitrary scale
-#random_page_cost = 4.0 # same scale as above
-#cpu_tuple_cost = 0.01 # same scale as above
-#cpu_index_tuple_cost = 0.005 # same scale as above
-#cpu_operator_cost = 0.0025 # same scale as above
-#parallel_setup_cost = 1000.0 # same scale as above
-#parallel_tuple_cost = 0.1 # same scale as above
+#seq_page_cost = 1.0 # measured on an arbitrary scale
+#random_page_cost = 4.0 # same scale as above
+#cpu_tuple_cost = 0.01 # same scale as above
+#cpu_index_tuple_cost = 0.005 # same scale as above
+#cpu_operator_cost = 0.0025 # same scale as above
+#parallel_setup_cost = 1000.0 # same scale as above
+#parallel_tuple_cost = 0.1 # same scale as above
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
#effective_cache_size = 4GB
#min_eager_agg_group_size = 8.0
-#jit_above_cost = 100000 # perform JIT compilation if available
- # and query more expensive than this;
- # -1 disables
-#jit_inline_above_cost = 500000 # inline small functions if query is
- # more expensive than this; -1 disables
-#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if
- # query is more expensive than this;
- # -1 disables
+#jit_above_cost = 100000 # perform JIT compilation if available
+ # and query more expensive than this;
+ # -1 disables
+#jit_inline_above_cost = 500000 # inline small functions if query is
+ # more expensive than this; -1 disables
+#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if
+ # query is more expensive than this;
+ # -1 disables
# - Genetic Query Optimizer -
#geqo = on
#geqo_threshold = 12
-#geqo_effort = 5 # range 1-10
-#geqo_pool_size = 0 # selects default based on effort
-#geqo_generations = 0 # selects default based on effort
-#geqo_selection_bias = 2.0 # range 1.5-2.0
-#geqo_seed = 0.0 # range 0.0-1.0
+#geqo_effort = 5 # range 1-10
+#geqo_pool_size = 0 # selects default based on effort
+#geqo_generations = 0 # selects default based on effort
+#geqo_selection_bias = 2.0 # range 1.5-2.0
+#geqo_seed = 0.0 # range 0.0-1.0
# - Other Planner Options -
-#default_statistics_target = 100 # range 1-10000
-#constraint_exclusion = partition # on, off, or partition
-#cursor_tuple_fraction = 0.1 # range 0.0-1.0
+#default_statistics_target = 100 # range 1-10000
+#constraint_exclusion = partition # on, off, or partition
+#cursor_tuple_fraction = 0.1 # range 0.0-1.0
#from_collapse_limit = 8
-#jit = on # allow JIT compilation
-#join_collapse_limit = 8 # 1 disables collapsing of explicit
- # JOIN clauses
-#plan_cache_mode = auto # auto, force_generic_plan or
- # force_custom_plan
-#recursive_worktable_factor = 10.0 # range 0.001-1000000
+#jit = on # allow JIT compilation
+#join_collapse_limit = 8 # 1 disables collapsing of explicit
+ # JOIN clauses
+#plan_cache_mode = auto # auto, force_generic_plan or
+ # force_custom_plan
+#recursive_worktable_factor = 10.0 # range 0.001-1000000
#------------------------------------------------------------------------------
@@ -483,38 +483,38 @@
# - Where to Log -
-#log_destination = 'stderr' # Valid values are combinations of
- # stderr, csvlog, jsonlog, syslog, and
- # eventlog, depending on platform.
- # csvlog and jsonlog require
- # logging_collector to be on.
+#log_destination = 'stderr' # Valid values are combinations of
+ # stderr, csvlog, jsonlog, syslog, and
+ # eventlog, depending on platform.
+ # csvlog and jsonlog require
+ # logging_collector to be on.
# This is used when logging to stderr:
-#logging_collector = off # Enable capturing of stderr, jsonlog,
- # and csvlog into log files. Required
- # to be on for csvlogs and jsonlogs.
- # (change requires restart)
+#logging_collector = off # Enable capturing of stderr, jsonlog,
+ # and csvlog into log files. Required
+ # to be on for csvlogs and jsonlogs.
+ # (change requires restart)
# These are only used if logging_collector is on:
-#log_directory = 'log' # directory where log files are written,
- # can be absolute or relative to PGDATA
-#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
- # can include strftime() escapes
-#log_file_mode = 0600 # creation mode for log files,
- # begin with 0 to use octal notation
-#log_rotation_age = 1d # Automatic rotation of logfiles will
- # happen after that time. 0 disables.
-#log_rotation_size = 10MB # Automatic rotation of logfiles will
- # happen after that much log output.
- # 0 disables.
-#log_truncate_on_rotation = off # If on, an existing log file with the
- # same name as the new log file will be
- # truncated rather than appended to.
- # But such truncation only occurs on
- # time-driven rotation, not on restarts
- # or size-driven rotation. Default is
- # off, meaning append to existing files
- # in all cases.
+#log_directory = 'log' # directory where log files are written,
+ # can be absolute or relative to PGDATA
+#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
+ # can include strftime() escapes
+#log_file_mode = 0600 # creation mode for log files,
+ # begin with 0 to use octal notation
+#log_rotation_age = 1d # Automatic rotation of logfiles will
+ # happen after that time. 0 disables.
+#log_rotation_size = 10MB # Automatic rotation of logfiles will
+ # happen after that much log output.
+ # 0 disables.
+#log_truncate_on_rotation = off # If on, an existing log file with the
+ # same name as the new log file will be
+ # truncated rather than appended to.
+ # But such truncation only occurs on
+ # time-driven rotation, not on restarts
+ # or size-driven rotation. Default is
+ # off, meaning append to existing files
+ # in all cases.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
@@ -528,58 +528,58 @@
# - When to Log -
-#log_min_messages = warning # values in order of decreasing detail:
- # debug5
- # debug4
- # debug3
- # debug2
- # debug1
- # info
- # notice
- # warning
- # error
- # log
- # fatal
- # panic
-
-#log_min_error_statement = error # values in order of decreasing detail:
- # debug5
- # debug4
- # debug3
- # debug2
- # debug1
- # info
- # notice
- # warning
- # error
- # log
- # fatal
- # panic (effectively off)
-
-#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
- # and their durations, > 0 logs only
- # statements running at least this number
- # of milliseconds
-
-#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements
- # and their durations, > 0 logs only a sample of
- # statements running at least this number
- # of milliseconds;
- # sample fraction is determined by log_statement_sample_rate
-
-#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding
- # log_min_duration_sample to be logged;
- # 1.0 logs all such statements, 0.0 never logs
-
-
-#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements
- # are logged regardless of their duration; 1.0 logs all
- # statements from all transactions, 0.0 never logs
-
-#log_startup_progress_interval = 10s # Time between progress updates for
- # long-running startup operations.
- # 0 disables the feature, > 0 indicates
- # the interval in milliseconds.
+#log_min_messages = warning # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # info
+ # notice
+ # warning
+ # error
+ # log
+ # fatal
+ # panic
+
+#log_min_error_statement = error # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # info
+ # notice
+ # warning
+ # error
+ # log
+ # fatal
+ # panic (effectively off)
+
+#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
+ # and their durations, > 0 logs only
+ # statements running at least this number
+ # of milliseconds
+
+#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements
+ # and their durations, > 0 logs only a sample of
+ # statements running at least this number
+ # of milliseconds;
+ # sample fraction is determined by log_statement_sample_rate
+
+#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding
+ # log_min_duration_sample to be logged;
+ # 1.0 logs all such statements, 0.0 never logs
+
+
+#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements
+ # are logged regardless of their duration; 1.0 logs all
+ # statements from all transactions, 0.0 never logs
+
+#log_startup_progress_interval = 10s # Time between progress updates for
+ # long-running startup operations.
+ # 0 disables the feature, > 0 indicates
+ # the interval in milliseconds.
# - What to Log -
@@ -588,70 +588,70 @@
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
-#log_autovacuum_min_duration = 10min # log vacuum activity by autovacuum;
- # -1 disables, 0 logs all actions and
- # their durations, > 0 logs only
- # actions running at least this number
- # of milliseconds.
-#log_autoanalyze_min_duration = 10min # log analyze activity by autovacuum;
- # -1 disables, 0 logs all actions and
- # their durations, > 0 logs only
- # actions running at least this number
- # of milliseconds.
+#log_autovacuum_min_duration = 10min # log vacuum activity by autovacuum;
+ # -1 disables, 0 logs all actions and
+ # their durations, > 0 logs only
+ # actions running at least this number
+ # of milliseconds.
+#log_autoanalyze_min_duration = 10min # log analyze activity by autovacuum;
+ # -1 disables, 0 logs all actions and
+ # their durations, > 0 logs only
+ # actions running at least this number
+ # of milliseconds.
#log_checkpoints = on
#log_connections = '' # log aspects of connection setup
# options include receipt, authentication, authorization,
# setup_durations, and all to log all of these aspects
#log_disconnections = off
#log_duration = off # log statement duration
-#log_error_verbosity = default # terse, default, or verbose messages
+#log_error_verbosity = default # terse, default, or verbose messages
#log_hostname = off
-#log_line_prefix = '%m [%p] ' # special values:
- # %a = application name
- # %u = user name
- # %d = database name
- # %r = remote host and port
- # %h = remote host
- # %L = local address
- # %b = backend type
- # %p = process ID
- # %P = process ID of parallel group leader
- # %t = timestamp without milliseconds
- # %m = timestamp with milliseconds
- # %n = timestamp with milliseconds (as a Unix epoch)
- # %Q = query ID (0 if none or not computed)
- # %i = command tag
- # %e = SQL state
- # %c = session ID
- # %l = session line number
- # %s = session start timestamp
- # %v = virtual transaction ID
- # %x = transaction ID (0 if none)
- # %q = stop here in non-session
- # processes
- # %% = '%'
- # e.g. '<%u%%%d> '
-#log_lock_waits = on # log lock waits >= deadlock_timeout
-#log_lock_failures = off # log lock failures
-#log_recovery_conflict_waits = off # log standby recovery conflict waits
- # >= deadlock_timeout
-#log_parameter_max_length = -1 # when logging statements, limit logged
- # bind-parameter values to N bytes;
- # -1 means print in full, 0 disables
-#log_parameter_max_length_on_error = 0 # when logging an error, limit logged
- # bind-parameter values to N bytes;
- # -1 means print in full, 0 disables
-#log_statement = 'none' # none, ddl, mod, all
+#log_line_prefix = '%m [%p] ' # special values:
+ # %a = application name
+ # %u = user name
+ # %d = database name
+ # %r = remote host and port
+ # %h = remote host
+ # %L = local address
+ # %b = backend type
+ # %p = process ID
+ # %P = process ID of parallel group leader
+ # %t = timestamp without milliseconds
+ # %m = timestamp with milliseconds
+ # %n = timestamp with milliseconds (as a Unix epoch)
+ # %Q = query ID (0 if none or not computed)
+ # %i = command tag
+ # %e = SQL state
+ # %c = session ID
+ # %l = session line number
+ # %s = session start timestamp
+ # %v = virtual transaction ID
+ # %x = transaction ID (0 if none)
+ # %q = stop here in non-session
+ # processes
+ # %% = '%'
+ # e.g. '<%u%%%d> '
+#log_lock_waits = on # log lock waits >= deadlock_timeout
+#log_lock_failures = off # log lock failures
+#log_recovery_conflict_waits = off # log standby recovery conflict waits
+ # >= deadlock_timeout
+#log_parameter_max_length = -1 # when logging statements, limit logged
+ # bind-parameter values to N bytes;
+ # -1 means print in full, 0 disables
+#log_parameter_max_length_on_error = 0 # when logging an error, limit logged
+ # bind-parameter values to N bytes;
+ # -1 means print in full, 0 disables
+#log_statement = 'none' # none, ddl, mod, all
#log_replication_commands = off
-#log_temp_files = -1 # log temporary files equal or larger
- # than the specified size in kilobytes;
- # -1 disables, 0 logs all temp files
+#log_temp_files = -1 # log temporary files equal or larger
+ # than the specified size in kilobytes;
+ # -1 disables, 0 logs all temp files
#log_timezone = 'GMT'
# - Process Title -
-#cluster_name = '' # added to process titles if nonempty
- # (change requires restart)
+#cluster_name = '' # added to process titles if nonempty
+ # (change requires restart)
#update_process_title = on
@@ -662,13 +662,13 @@
# - Cumulative Query and Index Statistics -
#track_activities = on
-#track_activity_query_size = 1024 # (change requires restart)
+#track_activity_query_size = 1024 # (change requires restart)
#track_counts = on
#track_cost_delay_timing = off
#track_io_timing = off
#track_wal_io_timing = off
-#track_functions = none # none, pl, all
-#stats_fetch_consistency = cache # cache, none, snapshot
+#track_functions = none # none, pl, all
+#stats_fetch_consistency = cache # cache, none, snapshot
# - Monitoring -
@@ -686,49 +686,49 @@
# - Automatic Vacuuming -
-#autovacuum = on # Enable autovacuum subprocess? 'on'
- # requires track_counts to also be on.
-#autovacuum_worker_slots = 16 # autovacuum worker slots to allocate
- # (change requires restart)
-#autovacuum_max_workers = 3 # max number of autovacuum subprocesses
-#autovacuum_naptime = 1min # time between autovacuum runs
-#autovacuum_vacuum_threshold = 50 # min number of row updates before
- # vacuum
-#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts
- # before vacuum; -1 disables insert
- # vacuums
-#autovacuum_analyze_threshold = 50 # min number of row updates before
- # analyze
-#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
-#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of unfrozen pages
+#autovacuum = on # Enable autovacuum subprocess? 'on'
+ # requires track_counts to also be on.
+#autovacuum_worker_slots = 16 # autovacuum worker slots to allocate
+ # (change requires restart)
+#autovacuum_max_workers = 3 # max number of autovacuum subprocesses
+#autovacuum_naptime = 1min # time between autovacuum runs
+#autovacuum_vacuum_threshold = 50 # min number of row updates before
+ # vacuum
+#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts
+ # before vacuum; -1 disables insert
+ # vacuums
+#autovacuum_analyze_threshold = 50 # min number of row updates before
+ # analyze
+#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
+#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of unfrozen pages
# before insert vacuum
-#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
+#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
#autovacuum_vacuum_max_threshold = 100000000 # max number of row updates
- # before vacuum; -1 disables max
- # threshold
-#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum
- # (change requires restart)
-#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age
- # before forced vacuum
- # (change requires restart)
-#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
- # autovacuum, in milliseconds;
- # -1 means use vacuum_cost_delay
-#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for
- # autovacuum, -1 means use
- # vacuum_cost_limit
+ # before vacuum; -1 disables max
+ # threshold
+#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum
+ # (change requires restart)
+#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age
+ # before forced vacuum
+ # (change requires restart)
+#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
+ # autovacuum, in milliseconds;
+ # -1 means use vacuum_cost_delay
+#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for
+ # autovacuum, -1 means use
+ # vacuum_cost_limit
# - Cost-Based Vacuum Delay -
-#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables)
-#vacuum_cost_page_hit = 1 # 0-10000 credits
-#vacuum_cost_page_miss = 2 # 0-10000 credits
-#vacuum_cost_page_dirty = 20 # 0-10000 credits
-#vacuum_cost_limit = 200 # 1-10000 credits
+#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables)
+#vacuum_cost_page_hit = 1 # 0-10000 credits
+#vacuum_cost_page_miss = 2 # 0-10000 credits
+#vacuum_cost_page_dirty = 20 # 0-10000 credits
+#vacuum_cost_limit = 200 # 1-10000 credits
# - Default Behavior -
-#vacuum_truncate = on # enable truncation after vacuum
+#vacuum_truncate = on # enable truncation after vacuum
# - Freezing -
@@ -746,38 +746,38 @@
# - Statement Behavior -
-#client_min_messages = notice # values in order of decreasing detail:
- # debug5
- # debug4
- # debug3
- # debug2
- # debug1
- # log
- # notice
- # warning
- # error
-#search_path = '"$user", public' # schema names
+#client_min_messages = notice # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # log
+ # notice
+ # warning
+ # error
+#search_path = '"$user", public' # schema names
#row_security = on
#default_table_access_method = 'heap'
-#default_tablespace = '' # a tablespace name, '' uses the default
-#default_toast_compression = 'pglz' # 'pglz' or 'lz4'
-#temp_tablespaces = '' # a list of tablespace names, '' uses
- # only default tablespace
+#default_tablespace = '' # a tablespace name, '' uses the default
+#default_toast_compression = 'pglz' # 'pglz' or 'lz4'
+#temp_tablespaces = '' # a list of tablespace names, '' uses
+ # only default tablespace
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role = 'origin'
-#statement_timeout = 0 # in milliseconds, 0 is disabled
-#transaction_timeout = 0 # in milliseconds, 0 is disabled
-#lock_timeout = 0 # in milliseconds, 0 is disabled
-#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
-#idle_session_timeout = 0 # in milliseconds, 0 is disabled
-#bytea_output = 'hex' # hex, escape
+#statement_timeout = 0 # in milliseconds, 0 is disabled
+#transaction_timeout = 0 # in milliseconds, 0 is disabled
+#lock_timeout = 0 # in milliseconds, 0 is disabled
+#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
+#idle_session_timeout = 0 # in milliseconds, 0 is disabled
+#bytea_output = 'hex' # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_pending_list_limit = 4MB
-#createrole_self_grant = '' # set and/or inherit
+#createrole_self_grant = '' # set and/or inherit
#event_triggers = on
# - Locale and Formatting -
@@ -785,27 +785,27 @@
#datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
#timezone = 'GMT'
-#timezone_abbreviations = 'Default' # Select the set of available time zone
- # abbreviations. Currently, there are
- # Default
- # Australia (historical usage)
- # India
- # You can create your own file in
- # share/timezonesets/.
-#extra_float_digits = 1 # min -15, max 3; any value >0 actually
- # selects precise output mode
-#client_encoding = sql_ascii # actually, defaults to database
- # encoding
+#timezone_abbreviations = 'Default' # Select the set of available time zone
+ # abbreviations. Currently, there are
+ # Default
+ # Australia (historical usage)
+ # India
+ # You can create your own file in
+ # share/timezonesets/.
+#extra_float_digits = 1 # min -15, max 3; any value >0 actually
+ # selects precise output mode
+#client_encoding = sql_ascii # actually, defaults to database
+ # encoding
# These settings are initialized by initdb, but they can be changed.
-#lc_messages = '' # locale for system error message
- # strings
-#lc_monetary = 'C' # locale for monetary formatting
-#lc_numeric = 'C' # locale for number formatting
-#lc_time = 'C' # locale for time formatting
+#lc_messages = '' # locale for system error message
+ # strings
+#lc_monetary = 'C' # locale for monetary formatting
+#lc_numeric = 'C' # locale for number formatting
+#lc_time = 'C' # locale for time formatting
-#icu_validation_level = warning # report ICU locale validation
- # errors at the given level
+#icu_validation_level = warning # report ICU locale validation
+ # errors at the given level
# default configuration for text search
#default_text_search_config = 'pg_catalog.simple'
@@ -814,8 +814,8 @@
#local_preload_libraries = ''
#session_preload_libraries = ''
-#shared_preload_libraries = '' # (change requires restart)
-#jit_provider = 'llvmjit' # JIT library to use
+#shared_preload_libraries = '' # (change requires restart)
+#jit_provider = 'llvmjit' # JIT library to use
# - Other Defaults -
@@ -829,14 +829,14 @@
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
-#max_locks_per_transaction = 64 # min 10
- # (change requires restart)
-#max_pred_locks_per_transaction = 64 # min 10
- # (change requires restart)
-#max_pred_locks_per_relation = -2 # negative values mean
- # (max_pred_locks_per_transaction
- # / -max_pred_locks_per_relation) - 1
-#max_pred_locks_per_page = 2 # min 0
+#max_locks_per_transaction = 64 # min 10
+ # (change requires restart)
+#max_pred_locks_per_transaction = 64 # min 10
+ # (change requires restart)
+#max_pred_locks_per_relation = -2 # negative values mean
+ # (max_pred_locks_per_transaction
+ # / -max_pred_locks_per_relation) - 1
+#max_pred_locks_per_page = 2 # min 0
#------------------------------------------------------------------------------
@@ -846,7 +846,7 @@
# - Previous PostgreSQL Versions -
#array_nulls = on
-#backslash_quote = safe_encoding # on, off, or safe_encoding
+#backslash_quote = safe_encoding # on, off, or safe_encoding
#escape_string_warning = on
#lo_compat_privileges = off
#quote_all_identifiers = off
@@ -863,12 +863,12 @@
# ERROR HANDLING
#------------------------------------------------------------------------------
-#exit_on_error = off # terminate session on any error?
-#restart_after_crash = on # reinitialize after backend crash?
-#data_sync_retry = off # retry or panic on failure to fsync
- # data?
- # (change requires restart)
-#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+)
+#exit_on_error = off # terminate session on any error?
+#restart_after_crash = on # reinitialize after backend crash?
+#data_sync_retry = off # retry or panic on failure to fsync
+ # data?
+ # (change requires restart)
+#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+)
#------------------------------------------------------------------------------
@@ -879,10 +879,10 @@
# default postgresql.conf. Note that these are directives, not variable
# assignments, so they can usefully be given more than once.
-#include_dir = '...' # include files ending in '.conf' from
- # a directory, e.g., 'conf.d'
-#include_if_exists = '...' # include file only if it exists
-#include = '...' # include file
+#include_dir = '...' # include files ending in '.conf' from
+ # a directory, e.g., 'conf.d'
+#include_if_exists = '...' # include file only if it exists
+#include = '...' # include file
#------------------------------------------------------------------------------
diff --git a/src/test/modules/test_misc/t/003_check_guc.pl b/src/test/modules/test_misc/t/003_check_guc.pl
index 5ae23192a47..438baf5bc6f 100644
--- a/src/test/modules/test_misc/t/003_check_guc.pl
+++ b/src/test/modules/test_misc/t/003_check_guc.pl
@@ -44,13 +44,23 @@ my $sample_file = "$share_dir/postgresql.conf.sample";
# List of all the GUCs found in the sample file.
my @gucs_in_file;
+# List of all the lines with tabs in the sample file.
+my @lines_with_tabs;
+
# Read the sample file line-by-line, checking its contents to build a list
# of everything known as a GUC.
my $num_tests = 0;
+my $line_num = 0;
open(my $contents, '<', $sample_file)
|| die "Could not open $sample_file: $!";
while (my $line = <$contents>)
{
+ $line_num++;
+ if ($line =~ /\t/)
+ {
+ push @lines_with_tabs, $line_num;
+ }
+
# Check if this line matches a GUC parameter:
# - Each parameter is preceded by "#", but not "# " in the sample
# file.
@@ -92,6 +102,8 @@ my @sample_intersect = grep($not_in_sample_hash{$_}, @gucs_in_file);
is(scalar(@sample_intersect),
0, "no parameters marked as NOT_IN_SAMPLE in postgresql.conf.sample");
+is(scalar(@lines_with_tabs), 0, "no lines with tabs in postgresql.conf.sample");
+
# These would log some information only on errors.
foreach my $param (@missing_from_file)
{
@@ -111,5 +123,9 @@ foreach my $param (@sample_intersect)
"found GUC $param in postgresql.conf.sample, marked as NOT_IN_SAMPLE\n"
);
}
+foreach my $param (@lines_with_tabs)
+{
+ print("found tab in line $param in postgresql.conf.sample\n");
+}
done_testing();
--
2.39.5 (Apple Git-154)
Nathan Bossart <nathandbossart@gmail.com> writes:
I don't see a way in .gitattributes to check for _any_ tabs in a file, just
for beginning-of-line indentation with tabs. But it's easy enough to add a
check in the TAP test.
Works for me. Do we need any special .gitattributes for the file
at all, if we're relying on the TAP test to catch this?
regards, tom lane
On Fri, Nov 14, 2025 at 04:34:08PM -0500, Tom Lane wrote:
Works for me. Do we need any special .gitattributes for the file
at all, if we're relying on the TAP test to catch this?
We'd at least need -whitespace (I think), but I figured we might as well
highlight beginning-of-line tabs and trailing whitespace in diffs, too.
The TAP test wouldn't catch the latter.
--
nathan
Here is a rebased patch set. Notably, I've split it into three pieces.
I'm planning to add 0002 to .git-blame-ignore-revs, as testing indicates
this preserves the blame history reasonably well.
--
nathan
Attachments:
v3-0001-Update-.editorconfig-and-.gitattributes-for-postg.patchtext/plain; charset=us-asciiDownload
From 5d88f5b026dfe764d4e401297025ea865ae18bc5 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Mon, 17 Nov 2025 11:28:09 -0600
Subject: [PATCH v3 1/3] Update .editorconfig and .gitattributes for
postgresql.conf.sample.
This commit updates .editorconfig and .gitattributes in preparation
for a follow-up commit that will modify this file to use tabs
instead of spaces.
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/aReNUKdMgKxLqmq7%40nathan
---
.editorconfig | 6 ++++++
.gitattributes | 1 +
2 files changed, 7 insertions(+)
diff --git a/.editorconfig b/.editorconfig
index e20d15d4533..0ee9bd28ac4 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -85,6 +85,12 @@ insert_final_newline = true
indent_style = unset
tab_width = unset
+[src/backend/utils/misc/postgresql.conf.sample]
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+tab_width = unset
+
[*.out]
indent_style = unset
indent_size = unset
diff --git a/.gitattributes b/.gitattributes
index 4e26bbfb145..00092168393 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -19,6 +19,7 @@ README.* conflict-marker-size=48
*.data -whitespace
contrib/pgcrypto/sql/pgp-armor.sql whitespace=-blank-at-eol
src/backend/catalog/sql_features.txt whitespace=space-before-tab,blank-at-eof,-blank-at-eol
+src/backend/utils/misc/postgresql.conf.sample whitespace=space-before-tab,trailing-space,tab-in-indent
# Test output files that contain extra whitespace
*.out -whitespace
--
2.39.5 (Apple Git-154)
v3-0002-Switch-from-tabs-to-spaces-in-postgresql.conf.sam.patchtext/plain; charset=us-asciiDownload
From 2b12ba66340c3a2de53b61628de54ca2aff2dbd8 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Mon, 17 Nov 2025 11:35:13 -0600
Subject: [PATCH v3 2/3] Switch from tabs to spaces in postgresql.conf.sample.
This file is written for 8-space tabs, since we expect that users
who are editing their configuration files are using 8-space tabs.
However, most of PostgreSQL is written for 4-space tabs, and at
least one popular web interface defaults to 4-space tabs. Rather
than trying to standardize on a particular tab width for this file,
let's just switch to spaces.
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/aReNUKdMgKxLqmq7%40nathan
---
src/backend/utils/misc/postgresql.conf.sample | 976 +++++++++---------
1 file changed, 488 insertions(+), 488 deletions(-)
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index f503d36b92e..dc9e2255f8a 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -39,16 +39,16 @@
# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.
-#data_directory = 'ConfigDir' # use data in another directory
- # (change requires restart)
-#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
- # (change requires restart)
-#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
- # (change requires restart)
+#data_directory = 'ConfigDir' # use data in another directory
+ # (change requires restart)
+#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
+ # (change requires restart)
+#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
+ # (change requires restart)
# If external_pid_file is not explicitly set, no extra PID file is written.
-#external_pid_file = '' # write an extra PID file
- # (change requires restart)
+#external_pid_file = '' # write an extra PID file
+ # (change requires restart)
#------------------------------------------------------------------------------
@@ -57,47 +57,47 @@
# - Connection Settings -
-#listen_addresses = 'localhost' # what IP address(es) to listen on;
- # comma-separated list of addresses;
- # defaults to 'localhost'; use '*' for all
- # (change requires restart)
-#port = 5432 # (change requires restart)
-#max_connections = 100 # (change requires restart)
-#reserved_connections = 0 # (change requires restart)
-#superuser_reserved_connections = 3 # (change requires restart)
-#unix_socket_directories = '/tmp' # comma-separated list of directories
- # (change requires restart)
-#unix_socket_group = '' # (change requires restart)
-#unix_socket_permissions = 0777 # begin with 0 to use octal notation
- # (change requires restart)
-#bonjour = off # advertise server via Bonjour
- # (change requires restart)
-#bonjour_name = '' # defaults to the computer name
- # (change requires restart)
+#listen_addresses = 'localhost' # what IP address(es) to listen on;
+ # comma-separated list of addresses;
+ # defaults to 'localhost'; use '*' for all
+ # (change requires restart)
+#port = 5432 # (change requires restart)
+#max_connections = 100 # (change requires restart)
+#reserved_connections = 0 # (change requires restart)
+#superuser_reserved_connections = 3 # (change requires restart)
+#unix_socket_directories = '/tmp' # comma-separated list of directories
+ # (change requires restart)
+#unix_socket_group = '' # (change requires restart)
+#unix_socket_permissions = 0777 # begin with 0 to use octal notation
+ # (change requires restart)
+#bonjour = off # advertise server via Bonjour
+ # (change requires restart)
+#bonjour_name = '' # defaults to the computer name
+ # (change requires restart)
# - TCP settings -
# see "man tcp" for details
-#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds;
- # 0 selects the system default
-#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds;
- # 0 selects the system default
-#tcp_keepalives_count = 0 # TCP_KEEPCNT;
- # 0 selects the system default
-#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds;
- # 0 selects the system default
+#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds;
+ # 0 selects the system default
+#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds;
+ # 0 selects the system default
+#tcp_keepalives_count = 0 # TCP_KEEPCNT;
+ # 0 selects the system default
+#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds;
+ # 0 selects the system default
-#client_connection_check_interval = 0 # time between checks for client
- # disconnection while running queries;
- # 0 for never
+#client_connection_check_interval = 0 # time between checks for client
+ # disconnection while running queries;
+ # 0 for never
# - Authentication -
-#authentication_timeout = 1min # 1s-600s
-#password_encryption = scram-sha-256 # scram-sha-256 or (deprecated) md5
+#authentication_timeout = 1min # 1s-600s
+#password_encryption = scram-sha-256 # scram-sha-256 or (deprecated) md5
#scram_iterations = 4096
-#md5_password_warnings = on # display md5 deprecation warnings?
-#oauth_validator_libraries = '' # comma-separated list of trusted validator modules
+#md5_password_warnings = on # display md5 deprecation warnings?
+#oauth_validator_libraries = '' # comma-separated list of trusted validator modules
# GSSAPI using Kerberos
#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab'
@@ -112,8 +112,8 @@
#ssl_crl_file = ''
#ssl_crl_dir = ''
#ssl_key_file = 'server.key'
-#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed TLSv1.2 ciphers
-#ssl_tls13_ciphers = '' # allowed TLSv1.3 cipher suites, blank for default
+#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed TLSv1.2 ciphers
+#ssl_tls13_ciphers = '' # allowed TLSv1.3 cipher suites, blank for default
#ssl_prefer_server_ciphers = on
#ssl_groups = 'X25519:prime256v1'
#ssl_min_protocol_version = 'TLSv1.2'
@@ -129,96 +129,96 @@
# - Memory -
-#shared_buffers = 128MB # min 128kB
- # (change requires restart)
-#huge_pages = try # on, off, or try
- # (change requires restart)
-#huge_page_size = 0 # zero for system default
- # (change requires restart)
-#temp_buffers = 8MB # min 800kB
-#max_prepared_transactions = 0 # zero disables the feature
- # (change requires restart)
+#shared_buffers = 128MB # min 128kB
+ # (change requires restart)
+#huge_pages = try # on, off, or try
+ # (change requires restart)
+#huge_page_size = 0 # zero for system default
+ # (change requires restart)
+#temp_buffers = 8MB # min 800kB
+#max_prepared_transactions = 0 # zero disables the feature
+ # (change requires restart)
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
-#work_mem = 4MB # min 64kB
-#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem
-#maintenance_work_mem = 64MB # min 64kB
-#autovacuum_work_mem = -1 # min 64kB, or -1 to use maintenance_work_mem
-#logical_decoding_work_mem = 64MB # min 64kB
-#max_stack_depth = 2MB # min 100kB
-#shared_memory_type = mmap # the default is the first option
- # supported by the operating system:
- # mmap
- # sysv
- # windows
- # (change requires restart)
-#dynamic_shared_memory_type = posix # the default is usually the first option
- # supported by the operating system:
- # posix
- # sysv
- # windows
- # mmap
- # (change requires restart)
-#min_dynamic_shared_memory = 0MB # (change requires restart)
-#vacuum_buffer_usage_limit = 2MB # size of vacuum and analyze buffer access strategy ring;
- # 0 to disable vacuum buffer access strategy;
- # range 128kB to 16GB
+#work_mem = 4MB # min 64kB
+#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem
+#maintenance_work_mem = 64MB # min 64kB
+#autovacuum_work_mem = -1 # min 64kB, or -1 to use maintenance_work_mem
+#logical_decoding_work_mem = 64MB # min 64kB
+#max_stack_depth = 2MB # min 100kB
+#shared_memory_type = mmap # the default is the first option
+ # supported by the operating system:
+ # mmap
+ # sysv
+ # windows
+ # (change requires restart)
+#dynamic_shared_memory_type = posix # the default is usually the first option
+ # supported by the operating system:
+ # posix
+ # sysv
+ # windows
+ # mmap
+ # (change requires restart)
+#min_dynamic_shared_memory = 0MB # (change requires restart)
+#vacuum_buffer_usage_limit = 2MB # size of vacuum and analyze buffer access strategy ring;
+ # 0 to disable vacuum buffer access strategy;
+ # range 128kB to 16GB
# SLRU buffers (change requires restart)
-#commit_timestamp_buffers = 0 # memory for pg_commit_ts (0 = auto)
-#multixact_offset_buffers = 16 # memory for pg_multixact/offsets
-#multixact_member_buffers = 32 # memory for pg_multixact/members
-#notify_buffers = 16 # memory for pg_notify
-#serializable_buffers = 32 # memory for pg_serial
-#subtransaction_buffers = 0 # memory for pg_subtrans (0 = auto)
-#transaction_buffers = 0 # memory for pg_xact (0 = auto)
+#commit_timestamp_buffers = 0 # memory for pg_commit_ts (0 = auto)
+#multixact_offset_buffers = 16 # memory for pg_multixact/offsets
+#multixact_member_buffers = 32 # memory for pg_multixact/members
+#notify_buffers = 16 # memory for pg_notify
+#serializable_buffers = 32 # memory for pg_serial
+#subtransaction_buffers = 0 # memory for pg_subtrans (0 = auto)
+#transaction_buffers = 0 # memory for pg_xact (0 = auto)
# - Disk -
-#temp_file_limit = -1 # limits per-process temp file space
- # in kilobytes, or -1 for no limit
+#temp_file_limit = -1 # limits per-process temp file space
+ # in kilobytes, or -1 for no limit
-#file_copy_method = copy # copy, clone (if supported by OS)
+#file_copy_method = copy # copy, clone (if supported by OS)
-#max_notify_queue_pages = 1048576 # limits the number of SLRU pages allocated
- # for NOTIFY / LISTEN queue
+#max_notify_queue_pages = 1048576 # limits the number of SLRU pages allocated
+ # for NOTIFY / LISTEN queue
# - Kernel Resources -
-#max_files_per_process = 1000 # min 64
- # (change requires restart)
+#max_files_per_process = 1000 # min 64
+ # (change requires restart)
# - Background Writer -
-#bgwriter_delay = 200ms # 10-10000ms between rounds
-#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables
-#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round
-#bgwriter_flush_after = 0 # measured in pages, 0 disables
+#bgwriter_delay = 200ms # 10-10000ms between rounds
+#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables
+#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round
+#bgwriter_flush_after = 0 # measured in pages, 0 disables
# - I/O -
-#backend_flush_after = 0 # measured in pages, 0 disables
-#effective_io_concurrency = 16 # 1-1000; 0 disables issuing multiple simultaneous IO requests
-#maintenance_io_concurrency = 16 # 1-1000; same as effective_io_concurrency
-#io_max_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
- # (change requires restart)
-#io_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
-
-#io_method = worker # worker, io_uring, sync
- # (change requires restart)
-#io_max_concurrency = -1 # Max number of IOs that one process
- # can execute simultaneously
- # -1 sets based on shared_buffers
- # (change requires restart)
-#io_workers = 3 # 1-32;
+#backend_flush_after = 0 # measured in pages, 0 disables
+#effective_io_concurrency = 16 # 1-1000; 0 disables issuing multiple simultaneous IO requests
+#maintenance_io_concurrency = 16 # 1-1000; same as effective_io_concurrency
+#io_max_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
+ # (change requires restart)
+#io_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
+
+#io_method = worker # worker, io_uring, sync
+ # (change requires restart)
+#io_max_concurrency = -1 # Max number of IOs that one process
+ # can execute simultaneously
+ # -1 sets based on shared_buffers
+ # (change requires restart)
+#io_workers = 3 # 1-32;
# - Worker Processes -
-#max_worker_processes = 8 # (change requires restart)
-#max_parallel_workers_per_gather = 2 # limited by max_parallel_workers
-#max_parallel_maintenance_workers = 2 # limited by max_parallel_workers
-#max_parallel_workers = 8 # number of max_worker_processes that
- # can be used in parallel operations
+#max_worker_processes = 8 # (change requires restart)
+#max_parallel_workers_per_gather = 2 # limited by max_parallel_workers
+#max_parallel_maintenance_workers = 2 # limited by max_parallel_workers
+#max_parallel_workers = 8 # number of max_worker_processes that
+ # can be used in parallel operations
#parallel_leader_participation = on
@@ -228,104 +228,104 @@
# - Settings -
-#wal_level = replica # minimal, replica, or logical
- # (change requires restart)
-#fsync = on # flush data to disk for crash safety
- # (turning this off can cause
- # unrecoverable data corruption)
-#synchronous_commit = on # synchronization level;
- # off, local, remote_write, remote_apply, or on
-#wal_sync_method = fsync # the default is the first option
- # supported by the operating system:
- # open_datasync
- # fdatasync (default on Linux and FreeBSD)
- # fsync
- # fsync_writethrough
- # open_sync
-#full_page_writes = on # recover from partial page writes
-#wal_log_hints = off # also do full page writes of non-critical updates
- # (change requires restart)
-#wal_compression = off # enables compression of full-page writes;
- # off, pglz, lz4, zstd, or on
-#wal_init_zero = on # zero-fill new WAL files
-#wal_recycle = on # recycle WAL files
-#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
- # (change requires restart)
-#wal_writer_delay = 200ms # 1-10000 milliseconds
-#wal_writer_flush_after = 1MB # measured in pages, 0 disables
+#wal_level = replica # minimal, replica, or logical
+ # (change requires restart)
+#fsync = on # flush data to disk for crash safety
+ # (turning this off can cause
+ # unrecoverable data corruption)
+#synchronous_commit = on # synchronization level;
+ # off, local, remote_write, remote_apply, or on
+#wal_sync_method = fsync # the default is the first option
+ # supported by the operating system:
+ # open_datasync
+ # fdatasync (default on Linux and FreeBSD)
+ # fsync
+ # fsync_writethrough
+ # open_sync
+#full_page_writes = on # recover from partial page writes
+#wal_log_hints = off # also do full page writes of non-critical updates
+ # (change requires restart)
+#wal_compression = off # enables compression of full-page writes;
+ # off, pglz, lz4, zstd, or on
+#wal_init_zero = on # zero-fill new WAL files
+#wal_recycle = on # recycle WAL files
+#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
+ # (change requires restart)
+#wal_writer_delay = 200ms # 1-10000 milliseconds
+#wal_writer_flush_after = 1MB # measured in pages, 0 disables
#wal_skip_threshold = 2MB
-#commit_delay = 0 # range 0-100000, in microseconds
-#commit_siblings = 5 # range 0-1000
+#commit_delay = 0 # range 0-100000, in microseconds
+#commit_siblings = 5 # range 0-1000
# - Checkpoints -
-#checkpoint_timeout = 5min # range 30s-1d
-#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
-#checkpoint_flush_after = 0 # measured in pages, 0 disables
-#checkpoint_warning = 30s # 0 disables
+#checkpoint_timeout = 5min # range 30s-1d
+#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
+#checkpoint_flush_after = 0 # measured in pages, 0 disables
+#checkpoint_warning = 30s # 0 disables
#max_wal_size = 1GB
#min_wal_size = 80MB
# - Prefetching during recovery -
-#recovery_prefetch = try # prefetch pages referenced in the WAL?
-#wal_decode_buffer_size = 512kB # lookahead window used for prefetching
- # (change requires restart)
+#recovery_prefetch = try # prefetch pages referenced in the WAL?
+#wal_decode_buffer_size = 512kB # lookahead window used for prefetching
+ # (change requires restart)
# - Archiving -
-#archive_mode = off # enables archiving; off, on, or always
- # (change requires restart)
-#archive_library = '' # library to use to archive a WAL file
- # (empty string indicates archive_command should
- # be used)
-#archive_command = '' # command to use to archive a WAL file
- # placeholders: %p = path of file to archive
- # %f = file name only
- # e.g. 'test ! -f "/mnt/server/archivedir/%f" && cp "%p" "/mnt/server/archivedir/%f"'
-#archive_timeout = 0 # force a WAL file switch after this
- # number of seconds; 0 disables
+#archive_mode = off # enables archiving; off, on, or always
+ # (change requires restart)
+#archive_library = '' # library to use to archive a WAL file
+ # (empty string indicates archive_command should
+ # be used)
+#archive_command = '' # command to use to archive a WAL file
+ # placeholders: %p = path of file to archive
+ # %f = file name only
+ # e.g. 'test ! -f "/mnt/server/archivedir/%f" && cp "%p" "/mnt/server/archivedir/%f"'
+#archive_timeout = 0 # force a WAL file switch after this
+ # number of seconds; 0 disables
# - Archive Recovery -
# These are only used in recovery mode.
-#restore_command = '' # command to use to restore an archived WAL file
- # placeholders: %p = path of file to restore
- # %f = file name only
- # e.g. 'cp "/mnt/server/archivedir/%f" "%p"'
-#archive_cleanup_command = '' # command to execute at every restartpoint
-#recovery_end_command = '' # command to execute at completion of recovery
+#restore_command = '' # command to use to restore an archived WAL file
+ # placeholders: %p = path of file to restore
+ # %f = file name only
+ # e.g. 'cp "/mnt/server/archivedir/%f" "%p"'
+#archive_cleanup_command = '' # command to execute at every restartpoint
+#recovery_end_command = '' # command to execute at completion of recovery
# - Recovery Target -
# Set these only when performing a targeted recovery.
-#recovery_target = '' # 'immediate' to end recovery as soon as a
- # consistent state is reached
- # (change requires restart)
-#recovery_target_name = '' # the named restore point to which recovery will proceed
- # (change requires restart)
-#recovery_target_time = '' # the time stamp up to which recovery will proceed
- # (change requires restart)
-#recovery_target_xid = '' # the transaction ID up to which recovery will proceed
- # (change requires restart)
-#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed
- # (change requires restart)
-#recovery_target_inclusive = on # Specifies whether to stop:
- # just after the specified recovery target (on)
- # just before the recovery target (off)
- # (change requires restart)
-#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID
- # (change requires restart)
-#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown'
- # (change requires restart)
+#recovery_target = '' # 'immediate' to end recovery as soon as a
+ # consistent state is reached
+ # (change requires restart)
+#recovery_target_name = '' # the named restore point to which recovery will proceed
+ # (change requires restart)
+#recovery_target_time = '' # the time stamp up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_xid = '' # the transaction ID up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed
+ # (change requires restart)
+#recovery_target_inclusive = on # Specifies whether to stop:
+ # just after the specified recovery target (on)
+ # just before the recovery target (off)
+ # (change requires restart)
+#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID
+ # (change requires restart)
+#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown'
+ # (change requires restart)
# - WAL Summarization -
-#summarize_wal = off # run WAL summarizer process?
-#wal_summary_keep_time = '10d' # when to remove old summary files, 0 = never
+#summarize_wal = off # run WAL summarizer process?
+#wal_summary_keep_time = '10d' # when to remove old summary files, 0 = never
#------------------------------------------------------------------------------
@@ -336,66 +336,66 @@
# Set these on the primary and on any standby that will send replication data.
-#max_wal_senders = 10 # max number of walsender processes
- # (change requires restart)
-#max_replication_slots = 10 # max number of replication slots
- # (change requires restart)
-#wal_keep_size = 0 # in megabytes; 0 disables
-#max_slot_wal_keep_size = -1 # in megabytes; -1 disables
-#idle_replication_slot_timeout = 0 # in seconds; 0 disables
-#wal_sender_timeout = 60s # in milliseconds; 0 disables
-#track_commit_timestamp = off # collect timestamp of transaction commit
- # (change requires restart)
+#max_wal_senders = 10 # max number of walsender processes
+ # (change requires restart)
+#max_replication_slots = 10 # max number of replication slots
+ # (change requires restart)
+#wal_keep_size = 0 # in megabytes; 0 disables
+#max_slot_wal_keep_size = -1 # in megabytes; -1 disables
+#idle_replication_slot_timeout = 0 # in seconds; 0 disables
+#wal_sender_timeout = 60s # in milliseconds; 0 disables
+#track_commit_timestamp = off # collect timestamp of transaction commit
+ # (change requires restart)
# - Primary Server -
# These settings are ignored on a standby server.
-#synchronous_standby_names = '' # standby servers that provide sync rep
- # method to choose sync standbys, number of sync standbys,
- # and comma-separated list of application_name
- # from standby(s); '*' = all
-#synchronized_standby_slots = '' # streaming replication standby server slot
- # names that logical walsender processes will wait for
+#synchronous_standby_names = '' # standby servers that provide sync rep
+ # method to choose sync standbys, number of sync standbys,
+ # and comma-separated list of application_name
+ # from standby(s); '*' = all
+#synchronized_standby_slots = '' # streaming replication standby server slot
+ # names that logical walsender processes will wait for
# - Standby Servers -
# These settings are ignored on a primary server.
-#primary_conninfo = '' # connection string to sending server
-#primary_slot_name = '' # replication slot on sending server
-#hot_standby = on # "off" disallows queries during recovery
- # (change requires restart)
-#max_standby_archive_delay = 30s # max delay before canceling queries
- # when reading WAL from archive;
- # -1 allows indefinite delay
-#max_standby_streaming_delay = 30s # max delay before canceling queries
- # when reading streaming WAL;
- # -1 allows indefinite delay
-#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name
- # is not set
-#wal_receiver_status_interval = 10s # send replies at least this often
- # 0 disables
-#hot_standby_feedback = off # send info from standby to prevent
- # query conflicts
-#wal_receiver_timeout = 60s # time that receiver waits for
- # communication from primary
- # in milliseconds; 0 disables
-#wal_retrieve_retry_interval = 5s # time to wait before retrying to
- # retrieve WAL after a failed attempt
-#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery
-#sync_replication_slots = off # enables slot synchronization on the physical standby from the primary
+#primary_conninfo = '' # connection string to sending server
+#primary_slot_name = '' # replication slot on sending server
+#hot_standby = on # "off" disallows queries during recovery
+ # (change requires restart)
+#max_standby_archive_delay = 30s # max delay before canceling queries
+ # when reading WAL from archive;
+ # -1 allows indefinite delay
+#max_standby_streaming_delay = 30s # max delay before canceling queries
+ # when reading streaming WAL;
+ # -1 allows indefinite delay
+#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name
+ # is not set
+#wal_receiver_status_interval = 10s # send replies at least this often
+ # 0 disables
+#hot_standby_feedback = off # send info from standby to prevent
+ # query conflicts
+#wal_receiver_timeout = 60s # time that receiver waits for
+ # communication from primary
+ # in milliseconds; 0 disables
+#wal_retrieve_retry_interval = 5s # time to wait before retrying to
+ # retrieve WAL after a failed attempt
+#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery
+#sync_replication_slots = off # enables slot synchronization on the physical standby from the primary
# - Subscribers -
# These settings are ignored on a publisher.
-#max_active_replication_origins = 10 # max number of active replication origins
- # (change requires restart)
-#max_logical_replication_workers = 4 # taken from max_worker_processes
- # (change requires restart)
-#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers
-#max_parallel_apply_workers_per_subscription = 2 # taken from max_logical_replication_workers
+#max_active_replication_origins = 10 # max number of active replication origins
+ # (change requires restart)
+#max_logical_replication_workers = 4 # taken from max_worker_processes
+ # (change requires restart)
+#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers
+#max_parallel_apply_workers_per_subscription = 2 # taken from max_logical_replication_workers
#------------------------------------------------------------------------------
@@ -432,49 +432,49 @@
# - Planner Cost Constants -
-#seq_page_cost = 1.0 # measured on an arbitrary scale
-#random_page_cost = 4.0 # same scale as above
-#cpu_tuple_cost = 0.01 # same scale as above
-#cpu_index_tuple_cost = 0.005 # same scale as above
-#cpu_operator_cost = 0.0025 # same scale as above
-#parallel_setup_cost = 1000.0 # same scale as above
-#parallel_tuple_cost = 0.1 # same scale as above
+#seq_page_cost = 1.0 # measured on an arbitrary scale
+#random_page_cost = 4.0 # same scale as above
+#cpu_tuple_cost = 0.01 # same scale as above
+#cpu_index_tuple_cost = 0.005 # same scale as above
+#cpu_operator_cost = 0.0025 # same scale as above
+#parallel_setup_cost = 1000.0 # same scale as above
+#parallel_tuple_cost = 0.1 # same scale as above
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
#effective_cache_size = 4GB
#min_eager_agg_group_size = 8.0
-#jit_above_cost = 100000 # perform JIT compilation if available
- # and query more expensive than this;
- # -1 disables
-#jit_inline_above_cost = 500000 # inline small functions if query is
- # more expensive than this; -1 disables
-#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if
- # query is more expensive than this;
- # -1 disables
+#jit_above_cost = 100000 # perform JIT compilation if available
+ # and query more expensive than this;
+ # -1 disables
+#jit_inline_above_cost = 500000 # inline small functions if query is
+ # more expensive than this; -1 disables
+#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if
+ # query is more expensive than this;
+ # -1 disables
# - Genetic Query Optimizer -
#geqo = on
#geqo_threshold = 12
-#geqo_effort = 5 # range 1-10
-#geqo_pool_size = 0 # selects default based on effort
-#geqo_generations = 0 # selects default based on effort
-#geqo_selection_bias = 2.0 # range 1.5-2.0
-#geqo_seed = 0.0 # range 0.0-1.0
+#geqo_effort = 5 # range 1-10
+#geqo_pool_size = 0 # selects default based on effort
+#geqo_generations = 0 # selects default based on effort
+#geqo_selection_bias = 2.0 # range 1.5-2.0
+#geqo_seed = 0.0 # range 0.0-1.0
# - Other Planner Options -
-#default_statistics_target = 100 # range 1-10000
-#constraint_exclusion = partition # on, off, or partition
-#cursor_tuple_fraction = 0.1 # range 0.0-1.0
+#default_statistics_target = 100 # range 1-10000
+#constraint_exclusion = partition # on, off, or partition
+#cursor_tuple_fraction = 0.1 # range 0.0-1.0
#from_collapse_limit = 8
-#jit = on # allow JIT compilation
-#join_collapse_limit = 8 # 1 disables collapsing of explicit
- # JOIN clauses
-#plan_cache_mode = auto # auto, force_generic_plan or
- # force_custom_plan
-#recursive_worktable_factor = 10.0 # range 0.001-1000000
+#jit = on # allow JIT compilation
+#join_collapse_limit = 8 # 1 disables collapsing of explicit
+ # JOIN clauses
+#plan_cache_mode = auto # auto, force_generic_plan or
+ # force_custom_plan
+#recursive_worktable_factor = 10.0 # range 0.001-1000000
#------------------------------------------------------------------------------
@@ -483,38 +483,38 @@
# - Where to Log -
-#log_destination = 'stderr' # Valid values are combinations of
- # stderr, csvlog, jsonlog, syslog, and
- # eventlog, depending on platform.
- # csvlog and jsonlog require
- # logging_collector to be on.
+#log_destination = 'stderr' # Valid values are combinations of
+ # stderr, csvlog, jsonlog, syslog, and
+ # eventlog, depending on platform.
+ # csvlog and jsonlog require
+ # logging_collector to be on.
# This is used when logging to stderr:
-#logging_collector = off # Enable capturing of stderr, jsonlog,
- # and csvlog into log files. Required
- # to be on for csvlogs and jsonlogs.
- # (change requires restart)
+#logging_collector = off # Enable capturing of stderr, jsonlog,
+ # and csvlog into log files. Required
+ # to be on for csvlogs and jsonlogs.
+ # (change requires restart)
# These are only used if logging_collector is on:
-#log_directory = 'log' # directory where log files are written,
- # can be absolute or relative to PGDATA
-#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
- # can include strftime() escapes
-#log_file_mode = 0600 # creation mode for log files,
- # begin with 0 to use octal notation
-#log_rotation_age = 1d # Automatic rotation of logfiles will
- # happen after that time. 0 disables.
-#log_rotation_size = 10MB # Automatic rotation of logfiles will
- # happen after that much log output.
- # 0 disables.
-#log_truncate_on_rotation = off # If on, an existing log file with the
- # same name as the new log file will be
- # truncated rather than appended to.
- # But such truncation only occurs on
- # time-driven rotation, not on restarts
- # or size-driven rotation. Default is
- # off, meaning append to existing files
- # in all cases.
+#log_directory = 'log' # directory where log files are written,
+ # can be absolute or relative to PGDATA
+#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
+ # can include strftime() escapes
+#log_file_mode = 0600 # creation mode for log files,
+ # begin with 0 to use octal notation
+#log_rotation_age = 1d # Automatic rotation of logfiles will
+ # happen after that time. 0 disables.
+#log_rotation_size = 10MB # Automatic rotation of logfiles will
+ # happen after that much log output.
+ # 0 disables.
+#log_truncate_on_rotation = off # If on, an existing log file with the
+ # same name as the new log file will be
+ # truncated rather than appended to.
+ # But such truncation only occurs on
+ # time-driven rotation, not on restarts
+ # or size-driven rotation. Default is
+ # off, meaning append to existing files
+ # in all cases.
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
@@ -528,58 +528,58 @@
# - When to Log -
-#log_min_messages = warning # values in order of decreasing detail:
- # debug5
- # debug4
- # debug3
- # debug2
- # debug1
- # info
- # notice
- # warning
- # error
- # log
- # fatal
- # panic
-
-#log_min_error_statement = error # values in order of decreasing detail:
- # debug5
- # debug4
- # debug3
- # debug2
- # debug1
- # info
- # notice
- # warning
- # error
- # log
- # fatal
- # panic (effectively off)
-
-#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
- # and their durations, > 0 logs only
- # statements running at least this number
- # of milliseconds
-
-#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements
- # and their durations, > 0 logs only a sample of
- # statements running at least this number
- # of milliseconds;
- # sample fraction is determined by log_statement_sample_rate
-
-#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding
- # log_min_duration_sample to be logged;
- # 1.0 logs all such statements, 0.0 never logs
-
-
-#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements
- # are logged regardless of their duration; 1.0 logs all
- # statements from all transactions, 0.0 never logs
-
-#log_startup_progress_interval = 10s # Time between progress updates for
- # long-running startup operations.
- # 0 disables the feature, > 0 indicates
- # the interval in milliseconds.
+#log_min_messages = warning # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # info
+ # notice
+ # warning
+ # error
+ # log
+ # fatal
+ # panic
+
+#log_min_error_statement = error # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # info
+ # notice
+ # warning
+ # error
+ # log
+ # fatal
+ # panic (effectively off)
+
+#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
+ # and their durations, > 0 logs only
+ # statements running at least this number
+ # of milliseconds
+
+#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements
+ # and their durations, > 0 logs only a sample of
+ # statements running at least this number
+ # of milliseconds;
+ # sample fraction is determined by log_statement_sample_rate
+
+#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding
+ # log_min_duration_sample to be logged;
+ # 1.0 logs all such statements, 0.0 never logs
+
+
+#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements
+ # are logged regardless of their duration; 1.0 logs all
+ # statements from all transactions, 0.0 never logs
+
+#log_startup_progress_interval = 10s # Time between progress updates for
+ # long-running startup operations.
+ # 0 disables the feature, > 0 indicates
+ # the interval in milliseconds.
# - What to Log -
@@ -588,70 +588,70 @@
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
-#log_autovacuum_min_duration = 10min # log vacuum activity by autovacuum;
- # -1 disables, 0 logs all actions and
- # their durations, > 0 logs only
- # actions running at least this number
- # of milliseconds.
-#log_autoanalyze_min_duration = 10min # log analyze activity by autovacuum;
- # -1 disables, 0 logs all actions and
- # their durations, > 0 logs only
- # actions running at least this number
- # of milliseconds.
+#log_autovacuum_min_duration = 10min # log vacuum activity by autovacuum;
+ # -1 disables, 0 logs all actions and
+ # their durations, > 0 logs only
+ # actions running at least this number
+ # of milliseconds.
+#log_autoanalyze_min_duration = 10min # log analyze activity by autovacuum;
+ # -1 disables, 0 logs all actions and
+ # their durations, > 0 logs only
+ # actions running at least this number
+ # of milliseconds.
#log_checkpoints = on
#log_connections = '' # log aspects of connection setup
# options include receipt, authentication, authorization,
# setup_durations, and all to log all of these aspects
#log_disconnections = off
#log_duration = off # log statement duration
-#log_error_verbosity = default # terse, default, or verbose messages
+#log_error_verbosity = default # terse, default, or verbose messages
#log_hostname = off
-#log_line_prefix = '%m [%p] ' # special values:
- # %a = application name
- # %u = user name
- # %d = database name
- # %r = remote host and port
- # %h = remote host
- # %L = local address
- # %b = backend type
- # %p = process ID
- # %P = process ID of parallel group leader
- # %t = timestamp without milliseconds
- # %m = timestamp with milliseconds
- # %n = timestamp with milliseconds (as a Unix epoch)
- # %Q = query ID (0 if none or not computed)
- # %i = command tag
- # %e = SQL state
- # %c = session ID
- # %l = session line number
- # %s = session start timestamp
- # %v = virtual transaction ID
- # %x = transaction ID (0 if none)
- # %q = stop here in non-session
- # processes
- # %% = '%'
- # e.g. '<%u%%%d> '
-#log_lock_waits = on # log lock waits >= deadlock_timeout
-#log_lock_failures = off # log lock failures
-#log_recovery_conflict_waits = off # log standby recovery conflict waits
- # >= deadlock_timeout
-#log_parameter_max_length = -1 # when logging statements, limit logged
- # bind-parameter values to N bytes;
- # -1 means print in full, 0 disables
-#log_parameter_max_length_on_error = 0 # when logging an error, limit logged
- # bind-parameter values to N bytes;
- # -1 means print in full, 0 disables
-#log_statement = 'none' # none, ddl, mod, all
+#log_line_prefix = '%m [%p] ' # special values:
+ # %a = application name
+ # %u = user name
+ # %d = database name
+ # %r = remote host and port
+ # %h = remote host
+ # %L = local address
+ # %b = backend type
+ # %p = process ID
+ # %P = process ID of parallel group leader
+ # %t = timestamp without milliseconds
+ # %m = timestamp with milliseconds
+ # %n = timestamp with milliseconds (as a Unix epoch)
+ # %Q = query ID (0 if none or not computed)
+ # %i = command tag
+ # %e = SQL state
+ # %c = session ID
+ # %l = session line number
+ # %s = session start timestamp
+ # %v = virtual transaction ID
+ # %x = transaction ID (0 if none)
+ # %q = stop here in non-session
+ # processes
+ # %% = '%'
+ # e.g. '<%u%%%d> '
+#log_lock_waits = on # log lock waits >= deadlock_timeout
+#log_lock_failures = off # log lock failures
+#log_recovery_conflict_waits = off # log standby recovery conflict waits
+ # >= deadlock_timeout
+#log_parameter_max_length = -1 # when logging statements, limit logged
+ # bind-parameter values to N bytes;
+ # -1 means print in full, 0 disables
+#log_parameter_max_length_on_error = 0 # when logging an error, limit logged
+ # bind-parameter values to N bytes;
+ # -1 means print in full, 0 disables
+#log_statement = 'none' # none, ddl, mod, all
#log_replication_commands = off
-#log_temp_files = -1 # log temporary files equal or larger
- # than the specified size in kilobytes;
- # -1 disables, 0 logs all temp files
+#log_temp_files = -1 # log temporary files equal or larger
+ # than the specified size in kilobytes;
+ # -1 disables, 0 logs all temp files
#log_timezone = 'GMT'
# - Process Title -
-#cluster_name = '' # added to process titles if nonempty
- # (change requires restart)
+#cluster_name = '' # added to process titles if nonempty
+ # (change requires restart)
#update_process_title = on
@@ -662,13 +662,13 @@
# - Cumulative Query and Index Statistics -
#track_activities = on
-#track_activity_query_size = 1024 # (change requires restart)
+#track_activity_query_size = 1024 # (change requires restart)
#track_counts = on
#track_cost_delay_timing = off
#track_io_timing = off
#track_wal_io_timing = off
-#track_functions = none # none, pl, all
-#stats_fetch_consistency = cache # cache, none, snapshot
+#track_functions = none # none, pl, all
+#stats_fetch_consistency = cache # cache, none, snapshot
# - Monitoring -
@@ -686,49 +686,49 @@
# - Automatic Vacuuming -
-#autovacuum = on # Enable autovacuum subprocess? 'on'
- # requires track_counts to also be on.
-#autovacuum_worker_slots = 16 # autovacuum worker slots to allocate
- # (change requires restart)
-#autovacuum_max_workers = 3 # max number of autovacuum subprocesses
-#autovacuum_naptime = 1min # time between autovacuum runs
-#autovacuum_vacuum_threshold = 50 # min number of row updates before
- # vacuum
-#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts
- # before vacuum; -1 disables insert
- # vacuums
-#autovacuum_analyze_threshold = 50 # min number of row updates before
- # analyze
-#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
-#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of unfrozen pages
+#autovacuum = on # Enable autovacuum subprocess? 'on'
+ # requires track_counts to also be on.
+#autovacuum_worker_slots = 16 # autovacuum worker slots to allocate
+ # (change requires restart)
+#autovacuum_max_workers = 3 # max number of autovacuum subprocesses
+#autovacuum_naptime = 1min # time between autovacuum runs
+#autovacuum_vacuum_threshold = 50 # min number of row updates before
+ # vacuum
+#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts
+ # before vacuum; -1 disables insert
+ # vacuums
+#autovacuum_analyze_threshold = 50 # min number of row updates before
+ # analyze
+#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
+#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of unfrozen pages
# before insert vacuum
-#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
+#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
#autovacuum_vacuum_max_threshold = 100000000 # max number of row updates
- # before vacuum; -1 disables max
- # threshold
-#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum
- # (change requires restart)
-#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age
- # before forced vacuum
- # (change requires restart)
-#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
- # autovacuum, in milliseconds;
- # -1 means use vacuum_cost_delay
-#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for
- # autovacuum, -1 means use
- # vacuum_cost_limit
+ # before vacuum; -1 disables max
+ # threshold
+#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum
+ # (change requires restart)
+#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age
+ # before forced vacuum
+ # (change requires restart)
+#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for
+ # autovacuum, in milliseconds;
+ # -1 means use vacuum_cost_delay
+#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for
+ # autovacuum, -1 means use
+ # vacuum_cost_limit
# - Cost-Based Vacuum Delay -
-#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables)
-#vacuum_cost_page_hit = 1 # 0-10000 credits
-#vacuum_cost_page_miss = 2 # 0-10000 credits
-#vacuum_cost_page_dirty = 20 # 0-10000 credits
-#vacuum_cost_limit = 200 # 1-10000 credits
+#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables)
+#vacuum_cost_page_hit = 1 # 0-10000 credits
+#vacuum_cost_page_miss = 2 # 0-10000 credits
+#vacuum_cost_page_dirty = 20 # 0-10000 credits
+#vacuum_cost_limit = 200 # 1-10000 credits
# - Default Behavior -
-#vacuum_truncate = on # enable truncation after vacuum
+#vacuum_truncate = on # enable truncation after vacuum
# - Freezing -
@@ -746,38 +746,38 @@
# - Statement Behavior -
-#client_min_messages = notice # values in order of decreasing detail:
- # debug5
- # debug4
- # debug3
- # debug2
- # debug1
- # log
- # notice
- # warning
- # error
-#search_path = '"$user", public' # schema names
+#client_min_messages = notice # values in order of decreasing detail:
+ # debug5
+ # debug4
+ # debug3
+ # debug2
+ # debug1
+ # log
+ # notice
+ # warning
+ # error
+#search_path = '"$user", public' # schema names
#row_security = on
#default_table_access_method = 'heap'
-#default_tablespace = '' # a tablespace name, '' uses the default
-#default_toast_compression = 'pglz' # 'pglz' or 'lz4'
-#temp_tablespaces = '' # a list of tablespace names, '' uses
- # only default tablespace
+#default_tablespace = '' # a tablespace name, '' uses the default
+#default_toast_compression = 'pglz' # 'pglz' or 'lz4'
+#temp_tablespaces = '' # a list of tablespace names, '' uses
+ # only default tablespace
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role = 'origin'
-#statement_timeout = 0 # in milliseconds, 0 is disabled
-#transaction_timeout = 0 # in milliseconds, 0 is disabled
-#lock_timeout = 0 # in milliseconds, 0 is disabled
-#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
-#idle_session_timeout = 0 # in milliseconds, 0 is disabled
-#bytea_output = 'hex' # hex, escape
+#statement_timeout = 0 # in milliseconds, 0 is disabled
+#transaction_timeout = 0 # in milliseconds, 0 is disabled
+#lock_timeout = 0 # in milliseconds, 0 is disabled
+#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
+#idle_session_timeout = 0 # in milliseconds, 0 is disabled
+#bytea_output = 'hex' # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_pending_list_limit = 4MB
-#createrole_self_grant = '' # set and/or inherit
+#createrole_self_grant = '' # set and/or inherit
#event_triggers = on
# - Locale and Formatting -
@@ -785,27 +785,27 @@
#datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
#timezone = 'GMT'
-#timezone_abbreviations = 'Default' # Select the set of available time zone
- # abbreviations. Currently, there are
- # Default
- # Australia (historical usage)
- # India
- # You can create your own file in
- # share/timezonesets/.
-#extra_float_digits = 1 # min -15, max 3; any value >0 actually
- # selects precise output mode
-#client_encoding = sql_ascii # actually, defaults to database
- # encoding
+#timezone_abbreviations = 'Default' # Select the set of available time zone
+ # abbreviations. Currently, there are
+ # Default
+ # Australia (historical usage)
+ # India
+ # You can create your own file in
+ # share/timezonesets/.
+#extra_float_digits = 1 # min -15, max 3; any value >0 actually
+ # selects precise output mode
+#client_encoding = sql_ascii # actually, defaults to database
+ # encoding
# These settings are initialized by initdb, but they can be changed.
-#lc_messages = '' # locale for system error message
- # strings
-#lc_monetary = 'C' # locale for monetary formatting
-#lc_numeric = 'C' # locale for number formatting
-#lc_time = 'C' # locale for time formatting
+#lc_messages = '' # locale for system error message
+ # strings
+#lc_monetary = 'C' # locale for monetary formatting
+#lc_numeric = 'C' # locale for number formatting
+#lc_time = 'C' # locale for time formatting
-#icu_validation_level = warning # report ICU locale validation
- # errors at the given level
+#icu_validation_level = warning # report ICU locale validation
+ # errors at the given level
# default configuration for text search
#default_text_search_config = 'pg_catalog.simple'
@@ -814,8 +814,8 @@
#local_preload_libraries = ''
#session_preload_libraries = ''
-#shared_preload_libraries = '' # (change requires restart)
-#jit_provider = 'llvmjit' # JIT library to use
+#shared_preload_libraries = '' # (change requires restart)
+#jit_provider = 'llvmjit' # JIT library to use
# - Other Defaults -
@@ -829,14 +829,14 @@
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
-#max_locks_per_transaction = 64 # min 10
- # (change requires restart)
-#max_pred_locks_per_transaction = 64 # min 10
- # (change requires restart)
-#max_pred_locks_per_relation = -2 # negative values mean
- # (max_pred_locks_per_transaction
- # / -max_pred_locks_per_relation) - 1
-#max_pred_locks_per_page = 2 # min 0
+#max_locks_per_transaction = 64 # min 10
+ # (change requires restart)
+#max_pred_locks_per_transaction = 64 # min 10
+ # (change requires restart)
+#max_pred_locks_per_relation = -2 # negative values mean
+ # (max_pred_locks_per_transaction
+ # / -max_pred_locks_per_relation) - 1
+#max_pred_locks_per_page = 2 # min 0
#------------------------------------------------------------------------------
@@ -846,7 +846,7 @@
# - Previous PostgreSQL Versions -
#array_nulls = on
-#backslash_quote = safe_encoding # on, off, or safe_encoding
+#backslash_quote = safe_encoding # on, off, or safe_encoding
#escape_string_warning = on
#lo_compat_privileges = off
#quote_all_identifiers = off
@@ -863,12 +863,12 @@
# ERROR HANDLING
#------------------------------------------------------------------------------
-#exit_on_error = off # terminate session on any error?
-#restart_after_crash = on # reinitialize after backend crash?
-#data_sync_retry = off # retry or panic on failure to fsync
- # data?
- # (change requires restart)
-#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+)
+#exit_on_error = off # terminate session on any error?
+#restart_after_crash = on # reinitialize after backend crash?
+#data_sync_retry = off # retry or panic on failure to fsync
+ # data?
+ # (change requires restart)
+#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+)
#------------------------------------------------------------------------------
@@ -879,10 +879,10 @@
# default postgresql.conf. Note that these are directives, not variable
# assignments, so they can usefully be given more than once.
-#include_dir = '...' # include files ending in '.conf' from
- # a directory, e.g., 'conf.d'
-#include_if_exists = '...' # include file only if it exists
-#include = '...' # include file
+#include_dir = '...' # include files ending in '.conf' from
+ # a directory, e.g., 'conf.d'
+#include_if_exists = '...' # include file only if it exists
+#include = '...' # include file
#------------------------------------------------------------------------------
--
2.39.5 (Apple Git-154)
v3-0003-Check-for-tabs-in-postgresql.conf.sample.patchtext/plain; charset=us-asciiDownload
From d657208f77598ffafaed3e4f0364f6082f88f2a6 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Mon, 17 Nov 2025 11:48:57 -0600
Subject: [PATCH v3 3/3] Check for tabs in postgresql.conf.sample.
The previous commit updated this file to use tabs instead of
spaces. This commit adds a test to ensure that no new tabs are
added.
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/aReNUKdMgKxLqmq7%40nathan
---
src/test/modules/test_misc/t/003_check_guc.pl | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/src/test/modules/test_misc/t/003_check_guc.pl b/src/test/modules/test_misc/t/003_check_guc.pl
index 51349e98e93..604280d94d7 100644
--- a/src/test/modules/test_misc/t/003_check_guc.pl
+++ b/src/test/modules/test_misc/t/003_check_guc.pl
@@ -44,13 +44,21 @@ my $sample_file = "$share_dir/postgresql.conf.sample";
# List of all the GUCs found in the sample file.
my @gucs_in_file;
+# List of all lines with tabs in the sample files.
+my @lines_with_tabs;
+
# Read the sample file line-by-line, checking its contents to build a list
# of everything known as a GUC.
my $num_tests = 0;
+my $line_num = 0;
open(my $contents, '<', $sample_file)
|| die "Could not open $sample_file: $!";
while (my $line = <$contents>)
{
+ $line_num++;
+ push @lines_with_tabs, $line_num
+ if $line =~ /\t/;
+
# Check if this line matches a GUC parameter:
# - Each parameter is preceded by "#", but not "# " in the sample
# file.
@@ -97,6 +105,8 @@ my @sample_intersect = grep($not_in_sample_hash{$_}, @gucs_in_file);
is(scalar(@sample_intersect),
0, "no parameters marked as NOT_IN_SAMPLE in postgresql.conf.sample");
+is(scalar(@lines_with_tabs), 0, "no lines with tabs in postgresql.conf.sample");
+
# These would log some information only on errors.
foreach my $param (@missing_from_file)
{
@@ -116,5 +126,9 @@ foreach my $param (@sample_intersect)
"found GUC $param in postgresql.conf.sample, marked as NOT_IN_SAMPLE\n"
);
}
+foreach my $param (@lines_with_tabs)
+{
+ print("found tab in line $param in postgresql.conf.sample\n");
+}
done_testing();
--
2.39.5 (Apple Git-154)
Nathan Bossart <nathandbossart@gmail.com> writes:
Here is a rebased patch set. Notably, I've split it into three pieces.
I'm planning to add 0002 to .git-blame-ignore-revs, as testing indicates
this preserves the blame history reasonably well.
Good idea.
regards, tom lane
Hi Nathan,
I just reviewed the patch. Looks to me the correct three-commit split:
0001 updates tooling/configure so that 0002 will not introduce formatting violation
0002 makes large formatting rewrite (tab->white spaces), and so that the commit needs to be added to .git-blace-ignore-revs
0003 adds CI enforcement so that no future patches to reintroduce tabs
A tiny comment about a typo in 0003’s commit message:
```
The previous commit updated this file to use tabs instead of
spaces.
```
Should be “use spaces instead of tabs”.
On Nov 18, 2025, at 02:50, Nathan Bossart <nathandbossart@gmail.com> wrote:
Here is a rebased patch set. Notably, I've split it into three pieces.
I'm planning to add 0002 to .git-blame-ignore-revs, as testing indicates
this preserves the blame history reasonably well.--
nathan
<v3-0001-Update-.editorconfig-and-.gitattributes-for-postg.patch><v3-0002-Switch-from-tabs-to-spaces-in-postgresql.conf.sam.patch><v3-0003-Check-for-tabs-in-postgresql.conf.sample.patch>
Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/